home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 21 / AMIGAplus Sonderheft 21 (1999)(ICP)(DE)[!].iso / PublicDomain / Anwendungen / h8jpg / src / c2p_24h8.i next >
Text File  |  1999-08-23  |  8KB  |  467 lines

  1. ;
  2. ;
  3. ; RGB24_to_HAM8 - Chunky2Planar converter (optimized for 68030)
  4. ;
  5. ; code by Smack/Infect
  6. ; (Sat 15-May-99)
  7. ;
  8. ;  input format: RGB24 (3 bytes per pixel)
  9. ; output format: HAM8 RGBB (6 bitplanes are written)
  10. ;
  11. ; a0 - chunky input
  12. ; a1 - planar output
  13. ; a4 - bitplane size
  14. ; d7 - number of pixels to convert
  15. ;
  16. ;
  17. c2p_24h8
  18.     move.l    a1,-(a7)    ;output pointer
  19.     move.l    a0,-(a7)    ;input pointer
  20.  
  21.     addq.l    #7,d7
  22.     lsr.l    #3,d7    ;round up to multiple of 8
  23.     subq.l    #2,d7    ;1 for prefetch and 1 for dbf
  24.     move.l    d7,-(a7)    ;loop counter
  25.  
  26.     move.l    #$0f0f0f0f,d6    ;4bit-mask
  27.     move.l    #$ff00ff00,a5    ;8bit-mask
  28.     move.l    #$aaaaaaaa,a6    ;1bit-mask
  29.  
  30.  
  31.  
  32.  
  33.  
  34. ;pass-1- write lower two bitplanes (RGB levels 2,3)
  35. ;-------fetch + merge4
  36.     move.l    (a0)+,d0    ;r1.g1,b1.r2
  37.     move.l    (a0)+,d5    ;g2.b2,r3.g3
  38.     move.l    (a0)+,d2    ;b3.r4,g4.b4
  39.     move.l    d5,d1
  40.     move    d0,d1
  41.     ror.l    #8,d1        ;r2.g2,b2.b1
  42.     and.l    d6,d0
  43.     and.l    d6,d1
  44.     lsl.l    #4,d0
  45.     or.l    d1,d0
  46.     move    d0,d1
  47.     lsr    #8,d1
  48.     move.b    d1,d0        ;r1r2.g1g2,b1b2.b1b2
  49.     move.l    d2,d1
  50.     move    d5,d1
  51.     rol.l    #8,d1        ;r4.r3,g3.b3
  52.     and.l    d6,d2
  53.     and.l    d6,d1
  54.     lsl.l    #4,d1
  55.     or.l    d2,d1
  56.     move.b    d1,d2
  57.     lsl.l    #8,d1
  58.     move.b    d2,d1        ;r3r4.g3g4,b3b4.b3b4
  59.     move.l    (a0)+,d2    ;r5.g5,b5.r6
  60.     move.l    (a0)+,d5    ;g6.b6,r7.g7
  61.     move.l    (a0)+,d4    ;b7.r8,g8.b8
  62.     move.l    d5,d3
  63.     move    d2,d3
  64.     ror.l    #8,d3        ;r6.g6,b6.b5
  65.     and.l    d6,d2
  66.     and.l    d6,d3
  67.     lsl.l    #4,d2
  68.     or.l    d3,d2
  69.     move    d2,d3
  70.     lsr    #8,d3
  71.     move.b    d3,d2        ;r5r6.g5g6,b5b6.b5b6
  72.     move.l    d4,d3
  73.     move    d5,d3
  74.     rol.l    #8,d3        ;r8.r7,g7.b7
  75.     and.l    d6,d4
  76.     and.l    d6,d3
  77.     lsl.l    #4,d3
  78.     or.l    d4,d3
  79.     move.b    d3,d4
  80.     lsl.l    #8,d3
  81.     move.b    d4,d3        ;r7r8.g7g8,b7b8.b7b8
  82. ;-------merge16
  83.     move    d3,d5
  84.     move    d2,d4
  85.     move    d1,d3
  86.     move    d0,d2
  87.     swap    d3
  88.     swap    d2
  89.     move    d3,d1
  90.     move    d2,d0
  91.     move    d5,d3
  92.     move    d4,d2
  93. ;-------merge2
  94.     move.l    #$cccccccc,d5
  95.     and.l    d5,d0
  96.     and.l    d5,d1
  97.     and.l    d5,d2
  98.     and.l    d5,d3
  99.     lsr.l    #2,d2
  100.     lsr.l    #2,d3
  101.     or.l    d0,d2
  102.     or.l    d1,d3
  103. ;-------merge8
  104.     move.l    a5,d5
  105.     move.l    d2,d4
  106.     lsl.l    #8,d4
  107.     eor.l    d3,d4
  108.     and.l    d5,d4
  109.     eor.l    d4,d3
  110.     lsr.l    #8,d4
  111.     eor.l    d4,d2
  112. ;-------merge1
  113.     move.l    a6,d5
  114.     move.l    d2,d4
  115.     add.l    d4,d4
  116.     eor.l    d3,d4
  117.     and.l    d5,d4
  118.     eor.l    d4,d3    ;level2
  119.     lsr.l    #1,d4
  120.     move.l    d3,a3    ;level2 !!!!
  121.     eor.l    d2,d4    ;level3 !!!!
  122.  
  123. .loop23
  124. ;-------fetch + merge4
  125.     move.l    (a0)+,d0    ;r1.g1,b1.r2
  126.     move.l    (a0)+,d5    ;g2.b2,r3.g3
  127.     move.l    (a0)+,d2    ;b3.r4,g4.b4
  128.     move.l    d5,d1
  129.     move.l    d4,(a1,a4.l)        ;write level3 (delayed)
  130.     move    d0,d1
  131.     ror.l    #8,d1        ;r2.g2,b2.b1
  132.     and.l    d6,d0
  133.     and.l    d6,d1
  134.     lsl.l    #4,d0
  135.     or.l    d1,d0
  136.     move    d0,d1
  137.     lsr    #8,d1
  138.     move.b    d1,d0        ;r1r2.g1g2,b1b2.b1b2
  139.     move.l    d2,d1
  140.     move    d5,d1
  141.     rol.l    #8,d1        ;r4.r3,g3.b3
  142.     and.l    d6,d2
  143.     and.l    d6,d1
  144.     lsl.l    #4,d1
  145.     or.l    d2,d1
  146.     move.b    d1,d2
  147.     lsl.l    #8,d1
  148.     move.b    d2,d1        ;r3r4.g3g4,b3b4.b3b4
  149.     move.l    (a0)+,d2    ;r5.g5,b5.r6
  150.     move.l    (a0)+,d5    ;g6.b6,r7.g7
  151.     move.l    (a0)+,d4    ;b7.r8,g8.b8
  152.     move.l    d5,d3
  153.     move    d2,d3
  154.     ror.l    #8,d3        ;r6.g6,b6.b5
  155.     and.l    d6,d2
  156.     and.l    d6,d3
  157.     lsl.l    #4,d2
  158.     or.l    d3,d2
  159.     move    d2,d3
  160.     lsr    #8,d3
  161.     move.b    d3,d2        ;r5r6.g5g6,b5b6.b5b6
  162.     move.l    d4,d3
  163.     move    d5,d3
  164.     rol.l    #8,d3        ;r8.r7,g7.b7
  165.     and.l    d6,d4
  166.     and.l    d6,d3
  167.     lsl.l    #4,d3
  168.     or.l    d4,d3
  169.     move.b    d3,d4
  170.     lsl.l    #8,d3
  171.     move.b    d4,d3        ;r7r8.g7g8,b7b8.b7b8
  172. ;-------merge16
  173.     move.l    a3,(a1)+        ;write level2 (delayed)
  174.     move    d3,d5
  175.     move    d2,d4
  176.     move    d1,d3
  177.     move    d0,d2
  178.     swap    d3
  179.     swap    d2
  180.     move    d3,d1
  181.     move    d2,d0
  182.     move    d5,d3
  183.     move    d4,d2
  184. ;-------merge2
  185.     move.l    #$cccccccc,d5
  186.     and.l    d5,d0
  187.     and.l    d5,d1
  188.     and.l    d5,d2
  189.     and.l    d5,d3
  190.     lsr.l    #2,d2
  191.     lsr.l    #2,d3
  192.     or.l    d0,d2
  193.     or.l    d1,d3
  194. ;-------merge8
  195.     move.l    a5,d5
  196.     move.l    d2,d4
  197.     lsl.l    #8,d4
  198.     eor.l    d3,d4
  199.     and.l    d5,d4
  200.     eor.l    d4,d3
  201.     lsr.l    #8,d4
  202.     eor.l    d4,d2
  203. ;-------merge1
  204.     move.l    a6,d5
  205.     move.l    d2,d4
  206.     add.l    d4,d4
  207.     eor.l    d3,d4
  208.     and.l    d5,d4
  209.     eor.l    d4,d3    ;level2
  210.     lsr.l    #1,d4
  211.     move.l    d3,a3    ;level2 !!!!
  212.     eor.l    d2,d4    ;level3 !!!!
  213.     dbf    d7,.loop23
  214.  
  215.  
  216.  
  217.  
  218.     move.l    (a7)+,d7    ;loop counter
  219.     move.l    (a7)+,a0    ;input pointer
  220.     not.l    d6        ;inverse 4bit-mask
  221.  
  222.  
  223.  
  224.  
  225.  
  226. ;pass-2- write higher four bitplanes (RGB levels 4,5,6,7)
  227. ;-------fetch + merge4
  228.     move.l    (a0)+,d0    ;r1.g1,b1.r2
  229.     move.l    (a0)+,d5    ;g2.b2,r3.g3
  230.     move.l    (a0)+,d2    ;b3.r4,g4.b4
  231.     move.l    d5,d1
  232.     move.l    d4,(a1,a4.l)        ;write level3 (flush)
  233.     move    d0,d1
  234.     ror.l    #8,d1        ;r2.g2,b2.b1
  235.     and.l    d6,d0
  236.     and.l    d6,d1
  237.     lsr.l    #4,d1
  238.     or.l    d1,d0
  239.     move    d0,d1
  240.     lsr    #8,d1
  241.     move.b    d1,d0        ;r1r2.g1g2,b1b2.b1b2
  242.     move.l    d2,d1
  243.     move    d5,d1
  244.     rol.l    #8,d1        ;r4.r3,g3.b3
  245.     and.l    d6,d2
  246.     and.l    d6,d1
  247.     lsr.l    #4,d2
  248.     or.l    d2,d1
  249.     move.b    d1,d2
  250.     lsl.l    #8,d1
  251.     move.b    d2,d1        ;r3r4.g3g4,b3b4.b3b4
  252.     move.l    (a0)+,d2    ;r5.g5,b5.r6
  253.     move.l    (a0)+,d5    ;g6.b6,r7.g7
  254.     move.l    (a0)+,d4    ;b7.r8,g8.b8
  255.     move.l    d5,d3
  256.     move    d2,d3
  257.     ror.l    #8,d3        ;r6.g6,b6.b5
  258.     and.l    d6,d2
  259.     and.l    d6,d3
  260.     lsr.l    #4,d3
  261.     or.l    d3,d2
  262.     move    d2,d3
  263.     lsr    #8,d3
  264.     move.b    d3,d2        ;r5r6.g5g6,b5b6.b5b6
  265.     move.l    d4,d3
  266.     move    d5,d3
  267.     rol.l    #8,d3        ;r8.r7,g7.b7
  268.     and.l    d6,d4
  269.     and.l    d6,d3
  270.     lsr.l    #4,d4
  271.     or.l    d4,d3
  272.     move.b    d3,d4
  273.     lsl.l    #8,d3
  274.     move.b    d4,d3        ;r7r8.g7g8,b7b8.b7b8
  275. ;-------merge16
  276.     move.l    a3,(a1)            ;write level2 (flush)
  277.     move    d3,d5
  278.     move    d2,d4
  279.     move    d1,d3
  280.     move    d0,d2
  281.     swap    d3
  282.     swap    d2
  283.     move    d3,d1
  284.     move    d2,d0
  285.     move    d5,d3
  286.     move    d4,d2
  287. ;-------merge2
  288.     move.l    #$cccccccc,d5
  289.     move.l    d0,d4
  290.     lsl.l    #2,d4
  291.     eor.l    d2,d4
  292.     and.l    d5,d4
  293.     eor.l    d4,d2
  294.     lsr.l    #2,d4
  295.     eor.l    d4,d0
  296.     move.l    d1,d4
  297.     lsl.l    #2,d4
  298.     eor.l    d3,d4
  299.     and.l    d5,d4
  300.     eor.l    d4,d3
  301.     lsr.l    #2,d4
  302.     eor.l    d4,d1
  303. ;-------merge8
  304.     move.l    (a7)+,a1    ;output pointer
  305.     move.l    a5,d5
  306.     move.l    d0,d4
  307.     lea    (a1,a4.l*2),a1
  308.     lsl.l    #8,d4
  309.     eor.l    d1,d4
  310.     and.l    d5,d4
  311.     eor.l    d4,d1
  312.     lsr.l    #8,d4
  313.     eor.l    d4,d0
  314.     move.l    d2,d4
  315.     lsl.l    #8,d4
  316.     eor.l    d3,d4
  317.     and.l    d5,d4
  318.     eor.l    d4,d3
  319.     lsr.l    #8,d4
  320.     eor.l    d4,d2
  321. ;-------merge1
  322.     move.l    a6,d5
  323.     move.l    d0,d4
  324.     add.l    d4,d4
  325.     eor.l    d1,d4
  326.     and.l    d5,d4
  327.     eor.l    d4,d1    ;level6
  328.     move.l    d1,(a1,a4.l*2)        ;write level6 (immediately)
  329.     lsr.l    #1,d4
  330.     eor.l    d4,d0    ;level7
  331.     move.l    d2,d4
  332.     move.l    d0,a2    ;level7 !!!!
  333.     add.l    d4,d4
  334.     eor.l    d3,d4
  335.     and.l    d5,d4
  336.     eor.l    d4,d3    ;level4
  337.     lsr.l    #1,d4
  338.     move.l    d3,a3    ;level4 !!!!
  339.     eor.l    d2,d4    ;level5 !!!!
  340.  
  341. .loop4567
  342. ;-------fetch + merge4
  343.     move.l    (a0)+,d0    ;r1.g1,b1.r2
  344.     move.l    (a0)+,d5    ;g2.b2,r3.g3
  345.     move.l    (a0)+,d2    ;b3.r4,g4.b4
  346.     add.l    a4,a1            ;level up
  347.     move.l    d5,d1
  348.     move.l    d4,(a1)            ;write level5 (delayed)
  349.     move    d0,d1
  350.     ror.l    #8,d1        ;r2.g2,b2.b1
  351.     and.l    d6,d0
  352.     and.l    d6,d1
  353.     lsr.l    #4,d1
  354.     or.l    d1,d0
  355.     move    d0,d1
  356.     lsr    #8,d1
  357.     move.b    d1,d0        ;r1r2.g1g2,b1b2.b1b2
  358.     move.l    d2,d1
  359.     move    d5,d1
  360.     rol.l    #8,d1        ;r4.r3,g3.b3
  361.     and.l    d6,d2
  362.     and.l    d6,d1
  363.     lsr.l    #4,d2
  364.     or.l    d2,d1
  365.     move.b    d1,d2
  366.     lsl.l    #8,d1
  367.     move.b    d2,d1        ;r3r4.g3g4,b3b4.b3b4
  368.     move.l    (a0)+,d2    ;r5.g5,b5.r6
  369.     move.l    (a0)+,d5    ;g6.b6,r7.g7
  370.     move.l    (a0)+,d4    ;b7.r8,g8.b8
  371.     move.l    d5,d3
  372.     move.l    a2,(a1,a4.l*2)        ;write level7 (delayed)
  373.     move    d2,d3
  374.     ror.l    #8,d3        ;r6.g6,b6.b5
  375.     and.l    d6,d2
  376.     and.l    d6,d3
  377.     lsr.l    #4,d3
  378.     or.l    d3,d2
  379.     move    d2,d3
  380.     lsr    #8,d3
  381.     move.b    d3,d2        ;r5r6.g5g6,b5b6.b5b6
  382.     move.l    d4,d3
  383.     move    d5,d3
  384.     rol.l    #8,d3        ;r8.r7,g7.b7
  385.     and.l    d6,d4
  386.     and.l    d6,d3
  387.     lsr.l    #4,d4
  388.     or.l    d4,d3
  389.     move.b    d3,d4
  390.     lsl.l    #8,d3
  391.     move.b    d4,d3        ;r7r8.g7g8,b7b8.b7b8
  392. ;-------merge16
  393.     move    d3,d5
  394.     move    d2,d4
  395.     move    d1,d3
  396.     move    d0,d2
  397.     swap    d3
  398.     swap    d2
  399.     move    d3,d1
  400.     move    d2,d0
  401.     move    d5,d3
  402.     move    d4,d2
  403. ;-------merge2
  404.     sub.l    a4,a1            ;level down
  405.     move.l    #$cccccccc,d5
  406.     move.l    d0,d4
  407.     move.l    a3,(a1)+        ;write level4 (delayed)
  408.     lsl.l    #2,d4
  409.     eor.l    d2,d4
  410.     and.l    d5,d4
  411.     eor.l    d4,d2
  412.     lsr.l    #2,d4
  413.     eor.l    d4,d0
  414.     move.l    d1,d4
  415.     lsl.l    #2,d4
  416.     eor.l    d3,d4
  417.     and.l    d5,d4
  418.     eor.l    d4,d3
  419.     lsr.l    #2,d4
  420.     eor.l    d4,d1
  421. ;-------merge8
  422.     move.l    a5,d5
  423.     move.l    d0,d4
  424.     lsl.l    #8,d4
  425.     eor.l    d1,d4
  426.     and.l    d5,d4
  427.     eor.l    d4,d1
  428.     lsr.l    #8,d4
  429.     eor.l    d4,d0
  430.     move.l    d2,d4
  431.     lsl.l    #8,d4
  432.     eor.l    d3,d4
  433.     and.l    d5,d4
  434.     eor.l    d4,d3
  435.     lsr.l    #8,d4
  436.     eor.l    d4,d2
  437. ;-------merge1
  438.     move.l    a6,d5
  439.     move.l    d0,d4
  440.     add.l    d4,d4
  441.     eor.l    d1,d4
  442.     and.l    d5,d4
  443.     eor.l    d4,d1    ;level6
  444.     move.l    d1,(a1,a4.l*2)        ;write level6 (immediately)
  445.     lsr.l    #1,d4
  446.     eor.l    d4,d0    ;level7
  447.     move.l    d2,d4
  448.     move.l    d0,a2    ;level7 !!!!
  449.     add.l    d4,d4
  450.     eor.l    d3,d4
  451.     and.l    d5,d4
  452.     eor.l    d4,d3    ;level4
  453.     lsr.l    #1,d4
  454.     move.l    d3,a3    ;level4 !!!!
  455.     eor.l    d2,d4    ;level5 !!!!
  456.     dbf    d7,.loop4567
  457.  
  458.  
  459.  
  460.  
  461.     move.l    a3,(a1)            ;write level4 (flush)
  462.     add.l    a4,a1
  463.     move.l    d4,(a1)            ;write level5 (flush)
  464.     move.l    a2,(a1,a4.l*2)        ;write level7 (flush)
  465.  
  466.     rts
  467.